package clasificador.genetico;

import java.util.ArrayList;
import java.util.Iterator;

import utils.Couple;
import utils.Weighted;

/* Estas politicas de emparejamiento eligen cada miembro de la pareja
 * de manera independiente, sin tener en cuenta sus correlaciones. Por ejemplo,
 * de mejor a peor, o probabilisticamente de mejor a peor.
 */
public abstract class PoliticaEmparejamientoIndependiente<Cromosoma> implements
		PoliticaEmparejamiento<Cromosoma> {	
	
	@Override
	public Iterator<Couple<Weighted<Cromosoma>>> emparejar(ArrayList<Weighted<Cromosoma>> poblacion) {
		return new IteradorEmparejamientoIndependiente(poblacion);
	}
	
	private class IteradorEmparejamientoIndependiente implements Iterator<Couple<Weighted<Cromosoma>>>
	{
		private Iterator<Weighted<Cromosoma>> selectorIndividual;
		
		private IteradorEmparejamientoIndependiente(ArrayList<Weighted<Cromosoma>> poblacion)
		{
			this.selectorIndividual = selectorIndividual(poblacion);
		}
		@Override
		public boolean hasNext() {
			return selectorIndividual.hasNext();			
		}

		@Override
		public Couple<Weighted<Cromosoma>> next() {
			Weighted<Cromosoma> c1, c2;
			c1 = selectorIndividual.next();
			c2 = selectorIndividual.hasNext()?
				selectorIndividual.next():
				c1;
			
            return new Couple(c1, c2);
		}

		@Override
		public void remove() {
            selectorIndividual.next();
            selectorIndividual.next();
		}	
	}
	protected abstract Iterator<Weighted<Cromosoma>> selectorIndividual(ArrayList<Weighted<Cromosoma>> poblacion);
}
